home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / The Best of BMUG / Utilities / Text and Speech / Alpha.5.76 / Tcl / SystemCode / latex.tcl < prev    next >
Text File  |  1994-03-16  |  56KB  |  2,547 lines

  1. #############################################################################
  2. #
  3. # latex.tcl:  macros and bindings for LaTeX users
  4. #
  5. # -- see files 'LaTeX Help' and 'commands.tex' in the Help folder
  6. #
  7. #############################################################################
  8. #
  9. # version 1.1 and 1.2 (11/10/92) by Richard T. Austin (austin@eecs.umich.edu)
  10. # version 2.0 (1/24/93) by Tom Scavo (scavo@cie.uoregon.edu)
  11. #
  12. # If you make improvements to this file, please share them!
  13. #
  14. #############################################################################
  15.  
  16. source "$HOME:Tcl:UserCode:smart.tcl"
  17.  
  18. #############################################################################
  19. #
  20. # Flags and Variables.
  21. #
  22. #############################################################################
  23.  
  24. set true 1
  25. set false 0
  26. # set insertLatexParameter $true
  27. # set noInsertLatexParameter $false
  28.  
  29. initTclFlag useBoxMacro
  30. initTclFlag deleteObjectNoisily
  31. initTclFlag deleteEnvironmentNoisily
  32. set useBoxMacro $true
  33. set deleteObjectNoisily $false
  34. set deleteEnvironmentNoisily $true
  35. initTclVar boxMacroName
  36. set boxMacroName "BoxedEPSF"
  37.  
  38.  
  39. #############################################################################
  40. #
  41. # Utility Macros.
  42. #
  43. #############################################################################
  44.  
  45. # A boolean function which checks to see if there's a current selection.
  46. proc isSelection {} {
  47.     return [string length [getSelect]]
  48. }
  49.  
  50. # Select the line containing the insertion point.
  51. proc lineSelect {} {
  52.     goto [lineStart [getPos]]
  53.     nextLineSelect
  54. }
  55.  
  56. # A boolean function which takes any string and tests to see if
  57. # that string contains all whitespace characters.  Carriage returns 
  58. # are considered whitespace, as are spaces and tabs.
  59. proc isWhitespace {anyString} {
  60.     set len [string length $anyString]
  61.     for {set i 0} {$i < $len} {incr i} {
  62.         set c [string index $anyString $i]
  63.         if {($c != "\ ") && ($c != "\t") && ($c != "\r")} then {return 0}
  64.     }
  65.     return 1
  66. }
  67.  
  68. # Insert a carriage return at the insertion point if any
  69. # character preceding the insertion point (on the same line)
  70. # is a non-whitespace character.
  71. proc openingCarriageReturn {} {
  72.     set end [getPos]
  73.     set start [lineStart $end]
  74.     set text [getText $start $end]
  75.     if {![isWhitespace $text]} carriageReturn
  76. }
  77.  
  78. # Insert a carriage return at the insertion point if any
  79. # character following the insertion point (on the same line)
  80. # is a non-whitespace character.
  81. proc closingCarriageReturn {} {
  82.     set start [getPos]
  83.     set end [nextLineStart $start]
  84.     set text [getText $start $end]
  85.     if {![isWhitespace $text]} carriageReturn
  86. }
  87.  
  88. # Set up tab stop mechanism.
  89. proc gotoTabStop {directionIndicator} {
  90.     set searchResult [search -n -f $directionIndicator -m 0 -i 1 -r 0 {•} [getPos]]
  91.     if {[llength $searchResult] == 0} then {
  92.         message "tab stop not found"
  93.         return 0
  94.     } else {
  95.         goto [lindex $searchResult 0]
  96.         return 1
  97.     }
  98. }
  99. proc nextTabStop {} {
  100.     if {[gotoTabStop 1]} {deleteChar}
  101. }
  102. proc previousTabStop {} {
  103.     if {[gotoTabStop 0]} {deleteChar}
  104. }
  105.  
  106. # Insert an object at the insertion point. If there is a selection and the 
  107. # global variable deleteObjectNoisily is false, quietly delete the selection 
  108. # first (just like "paste"). Otherwise, prompt the user for the appropriate 
  109. # action. Returns true if the object is ultimately inserted, and false if the 
  110. # user cancels the operation. 
  111. proc insertObject {objectName} {
  112.     global deleteObjectNoisily
  113.     if {[isSelection]} then {
  114.         if {$deleteObjectNoisily} then {
  115.             case [askyesno "Delete selection?"] in {
  116.                 "yes" {deleteText [getPos] [selEnd]}
  117.                 "no" {backwardChar}
  118.                 "cancel" {return 0}
  119.             }
  120.         } else {
  121.             deleteText [getPos] [selEnd]
  122.         }
  123.     }
  124.     insertText $objectName
  125.     return 1
  126. }
  127.  
  128. # Insert an object at the insertion point. If there is a selection, wrap 
  129. # it inside the parameters $left and $right. Returns true if there is a 
  130. # selection (in which case it will wrap), and false otherwise. 
  131. proc wrapObject {left right} {
  132.     set currentPos [getPos]
  133.     set selected [isSelection]
  134.     if {$selected} then {
  135.         replaceText $currentPos [selEnd] $left [getSelect] $right
  136.     } else {
  137.         insertText $left "•" $right
  138.     }
  139.     goto $currentPos
  140.     nextTabStop
  141.     return $selected
  142. }
  143.  
  144. # Inserts an environment with the specified name at the insertion point. 
  145. # Preserves indentation, and positions the cursor at the beginning of the 
  146. # environment body (to be inserted by the calling procedure). If the 
  147. # parameter latexParameter is true, a LaTeX parameter is inserted and the 
  148. # cursor is positioned there instead. Deletes the current selection quietly 
  149. # if the global variable deleteEnvironmentNoisily is false; otherwise the 
  150. # user is prompted for directions. Returns true if the environment is 
  151. # ultimately inserted, and false if the user cancels the operation. 
  152. proc insertEnvironment {environmentName latexParameter} {
  153.     global deleteEnvironmentNoisily
  154.     if {[isSelection]} then {
  155.         if {$deleteEnvironmentNoisily} then {
  156.             case [askyesno "Delete selection?"] in {
  157.                 "yes" {deleteText [getPos] [selEnd]}
  158.                 "no" {backwardChar}
  159.                 "cancel" {return 0}
  160.             }
  161.         } else {
  162.             deleteText [getPos] [selEnd]
  163.         }
  164.     }
  165.     set currentPos [getPos]
  166.     openingCarriageReturn
  167.     insertText "\\begin{" $environmentName "}"
  168.     # insert optional LaTeX parameter here:
  169.     if {$latexParameter} {insertText "{•}"}
  170.     carriageReturn
  171.     tab
  172.     insertText "•"
  173.     carriageReturn
  174.     backwardChar
  175.     deleteChar
  176.     insertText "\\end{" $environmentName "}•"
  177.     closingCarriageReturn
  178.     goto $currentPos
  179.     nextTabStop
  180.     return 1
  181. }
  182.  
  183. # Insert an environment with the given name at the insertion point. If there 
  184. # is currently a selection, cut and paste it into the body of the new 
  185. # environment, indent it, and leave it highlighted. Returns true if there is 
  186. # a selection, and false otherwise. 
  187. proc wrapEnvironment {environmentName latexParameter} {
  188.     if {[isSelection]} then {
  189.         set indent [indentString [getPos]]
  190.         set text [getSelect]
  191.         deleteText [getPos] [selEnd]
  192.         insertText $indent "\r"
  193.         backwardChar
  194.         insertEnvironment $environmentName $latexParameter
  195.         if {$latexParameter} then {
  196.             insertText "•"
  197.             nextTabStop
  198.         }
  199.         lineSelect
  200.         clear
  201.         insertText $text
  202.         markHilite
  203.         shiftRight
  204.         return 1
  205.     } else {
  206.         insertEnvironment $environmentName $latexParameter
  207.         return 0
  208.     }
  209. }
  210.  
  211.  
  212. #############################################################################
  213. # Paragraph Mode Macros.
  214. #
  215. #############################################################################
  216.  
  217. # Documents:
  218. proc insertDocument {documentType} {
  219.     set currentPos [getPos]
  220.     insertText "\\documentstyle\[•\]{$documentType}"
  221.     carriageReturn
  222.     insertEnvironment "document" 0
  223.     backwardChar
  224.     deleteChar
  225.     carriageReturn
  226.     insertText "•"
  227.     carriageReturn
  228.     nextTabStop
  229.     carriageReturn
  230.     goto $currentPos
  231.     nextTabStop
  232. }
  233. proc isDocumentSelected {} {
  234.     return 1
  235. }
  236. proc isEmptyFile {} {
  237.     return 1
  238. }
  239. proc wrapDocument {documentType} {
  240.     if {[isSelection]} then {
  241.         if {[isDocumentSelected]} then {
  242.             set text [getSelect]
  243.             deleteText [getPos] [selEnd]
  244.         } else {
  245.             case [askyesno "Select entire document?"] in {
  246.                 "yes" {}
  247.                 "no" {
  248.                     set text [getSelect]
  249.                     deleteText [getPos] [selEnd]
  250.                 }
  251.                 "cancel" {return 0}
  252.             }
  253.         }
  254.         set currentPos [getPos]
  255.         insertDocument $documentType
  256.         insertText "•"
  257.         nextTabStop
  258.         lineSelect
  259.         clear
  260.         insertText $text
  261.         markHilite
  262.         nextTabStop
  263.     } else {
  264.         if {![isEmptyFile]} then {
  265.             case [askyesno "Wrap existing text?"] in {
  266.                 "yes" {}
  267.                 "no" {}
  268.                 "cancel" {return 0}
  269.             }
  270.         }
  271.         insertDocument $documentType
  272.     }
  273.     return 1
  274. }
  275.  
  276. proc letter {} {
  277.     wrapDocument "letter"
  278.     message "type style option(s)"
  279. }
  280. proc article {} {
  281.     wrapDocument "article"
  282.     message "type style option(s)"
  283. }
  284. proc report {} {
  285.     wrapDocument "report"
  286.     message "type style option(s)"
  287. }
  288. proc book {} {
  289.     wrapDocument "book"
  290.     message "type style option(s)"
  291. }
  292.  
  293. proc custom {} {
  294.     catch {prompt "What document type?" "article"} documentType
  295.     if {$documentType != "cancel"} then {
  296.         wrapDocument $documentType
  297.         message "type style option(s)"
  298.     }
  299. }
  300.  
  301. # Sectioning:
  302. proc part {} {
  303.     if {[wrapObject "\\part{" "}•"]} then {
  304.         message "don't forget label"
  305.     } else {
  306.         message "type part name"
  307.     }
  308. }
  309. proc chapter {} {
  310.     if {[wrapObject "\\chapter{" "}•"]} then {
  311.         message "don't forget label"
  312.     } else {
  313.         message "type part name"
  314.     }
  315. }
  316. proc section {} {
  317.     if {[wrapObject "\\section{" "}•"]} then {
  318.         message "don't forget label"
  319.     } else {
  320.         message "type part name"
  321.     }
  322. }
  323. proc subsection {} {
  324.     if {[wrapObject "\\subsection{" "}•"]} then {
  325.         message "don't forget label"
  326.     } else {
  327.         message "type part name"
  328.     }
  329. }
  330. proc subsubsection {} {
  331.     if {[wrapObject "\\subsubsection{" "}•"]} then {
  332.         message "don't forget label"
  333.     } else {
  334.         message "type part name"
  335.     }
  336. }
  337. proc paragraph {} {
  338.     if {[wrapObject "\\paragraph{" "}•"]} then {
  339.         message "don't forget label"
  340.     } else {
  341.         message "type part name"
  342.     }
  343. }
  344. proc subparagraph {} {
  345.     if {[wrapObject "\\subparagraph{" "}•"]} then {
  346.         message "don't forget label"
  347.     } else {
  348.         message "type part name"
  349.     }
  350. }
  351.  
  352. # Definitions:
  353. proc myList {} {alertnote "Not yet implemented."}
  354. proc newcommand {} {alertnote "Not yet implemented."}
  355. proc newenvironment {} {alertnote "Not yet implemented."}
  356. proc newtheorem {} {alertnote "Not yet implemented."}
  357. proc renewcommand {} {alertnote "Not yet implemented."}
  358. proc renewenvironment {} {alertnote "Not yet implemented."}
  359.  
  360. # Text Style:
  361. proc roman {} {
  362.     if {[wrapObject "{\\rm " "}•"]} then {
  363.         message "roman text set"
  364.     } else {
  365.         message "enter roman text"
  366.     }
  367. }
  368. proc bold {} {
  369.     if {[wrapObject "{\\bf " "}•"]} then {
  370.         message "bold text set"
  371.     } else {
  372.         message "enter bold text"
  373.     }
  374. }
  375. proc italic {} {
  376.     if {[wrapObject "{\\it " "\\/}•"]} then {
  377.         insertText "•"
  378.         backwardChar
  379.         backwardChar
  380.     }
  381.     message "italic correction?"
  382. }
  383. proc emphatic {} {
  384.     if {[wrapObject "{\\em " "\\/}•"]} then {
  385.         insertText "•"
  386.         backwardChar
  387.         backwardChar
  388.     }
  389.     message "emphatic correction?"
  390. }
  391. proc slanted {} {
  392.     if {[wrapObject "{\\sl " "\\/}•"]} then {
  393.         insertText "•"
  394.         backwardChar
  395.         backwardChar
  396.     }
  397.     message "italic correction?"
  398. }
  399. proc sansSerif {} {
  400.     if {[wrapObject "{\\sf " "}•"]} then {
  401.         message "sans serif text set"
  402.     } else {
  403.         message "enter sans serif text"
  404.     }
  405. }
  406. proc smallCaps {} {
  407.     if {[wrapObject "{\\sc " "}•"]} then {
  408.         message "small caps text set"
  409.     } else {
  410.         message "enter small caps text"
  411.     }
  412. }
  413. proc typewriter {} {
  414.     if {[wrapObject "{\\tt " "}•"]} then {
  415.         message "typewriter text set"
  416.     } else {
  417.         message "enter typewriter text"
  418.     }
  419. }
  420.  
  421. # Text Size:
  422. proc tiny {} {
  423.     if {[wrapObject "{\\tiny " "}•"]} then {
  424.         message "tiny text set"
  425.     } else {
  426.         message "enter tiny text"
  427.     }
  428. }
  429. proc smallest {} {
  430.     if {[wrapObject "{\\scriptsize " "}•"]} then {
  431.         message "scriptsize text set"
  432.     } else {
  433.         message "enter scriptsize text"
  434.     }
  435. }
  436. proc smaller {} {
  437.     if {[wrapObject "{\\footnotesize " "}•"]} then {
  438.         message "footnotesize text set"
  439.     } else {
  440.         message "enter footnotesize text"
  441.     }
  442. }
  443. proc small {} {
  444.     if {[wrapObject "{\\small " "}•"]} then {
  445.         message "small text set"
  446.     } else {
  447.         message "enter small text"
  448.     }
  449. }
  450. proc normal {} {
  451.     if {[wrapObject "{\\normalsize " "}•"]} then {
  452.         message "normalsize text set"
  453.     } else {
  454.         message "enter normalsize text"
  455.     }
  456. }
  457. proc large {} {
  458.     if {[wrapObject "{\\large " "}•"]} then {
  459.         message "large text set"
  460.     } else {
  461.         message "enter large text"
  462.     }
  463. }
  464. proc larger {} {
  465.     if {[wrapObject "{\\Large " "}•"]} then {
  466.         message "Large text set"
  467.     } else {
  468.         message "enter Large text"
  469.     }
  470. }
  471. proc largest {} {
  472.     if {[wrapObject "{\\LARGE " "}•"]} then {
  473.         message "LARGE text set"
  474.     } else {
  475.         message "enter LARGE text"
  476.     }
  477. }
  478. proc huge {} {
  479.     if {[wrapObject "{\\huge " "}•"]} then {
  480.         message "huge text set"
  481.     } else {
  482.         message "enter huge text"
  483.     }
  484. }
  485. proc gigantic {} {
  486.     if {[wrapObject "{\\Huge " "}•"]} then {
  487.         message "Huge text set"
  488.     } else {
  489.         message "enter Huge text"
  490.     }
  491. }
  492.  
  493. # International:  not yet implemented.
  494.  
  495. # Environments:
  496. proc enumerate {} {
  497.     catch {prompt "enumerate:  how many items?" 3} numberItems
  498.     if {$numberItems != "cancel"} then {
  499.         set currentPos [getPos]
  500.         if {[insertEnvironment "enumerate" 0]} then {
  501.             item
  502.             insertText "  •"
  503.             for {set i 1} {$i < $numberItems} {incr i} {
  504.                 carriageReturn
  505.                 carriageReturn
  506.                 item
  507.                 insertText "  •"
  508.             }
  509.             goto $currentPos
  510.             nextTabStop
  511.             message "Type first item"
  512.         }
  513.     }
  514. }
  515. proc itemize {} {
  516.     catch {prompt "itemize:  how many items?" 3} numberItems
  517.     if {$numberItems != "cancel"} then {
  518.         set currentPos [getPos]
  519.         if {[insertEnvironment "itemize" 0]} then {
  520.             item
  521.             insertText "  •"
  522.             for {set i 1} {$i < $numberItems} {incr i} {
  523.                 carriageReturn
  524.                 carriageReturn
  525.                 item
  526.                 insertText "  •"
  527.             }
  528.             goto $currentPos
  529.             nextTabStop
  530.             message "Type first item"
  531.         }
  532.     }
  533. }
  534. proc description {} {
  535.     catch {prompt "description: how many items?" 3} numberItems
  536.     if {$numberItems != "cancel"} then {
  537.         set currentPos [getPos]
  538.         if {[insertEnvironment "description" 0]} then {
  539.             item
  540.             insertText "\[•\]  •"
  541.             for {set i 1} {$i < $numberItems} {incr i} {
  542.                 carriageReturn
  543.                 carriageReturn
  544.                 item
  545.                 insertText "\[•\]  •"
  546.             }
  547.             goto $currentPos
  548.             nextTabStop
  549.             message "Type first item"
  550.         }
  551.     }
  552. }
  553.  
  554. proc insertRow {jmax} {
  555.     insertText "•"
  556.     for {set j 1} {$j < $jmax} {incr j} {
  557.         insertText " & •"
  558.     }
  559. }
  560. proc tabular {} {
  561.     catch {prompt "tabular:  how many rows?" 3} numberRows
  562.     if {$numberRows != "cancel"} then {
  563.         catch {prompt "tabular:  how many columns?" 3} numberCols
  564.         if {$numberCols != "cancel"} then {
  565.             if {[insertEnvironment "tabular" 1]} then {
  566.                 set beginArgument [getPos]
  567.                 insertText "|"
  568.                 for {set j 1} {$j <= $numberCols} {incr j} {
  569.                     insertText "c|"
  570.                 }
  571.                 set endArgument [getPos]
  572.                 nextTabStop
  573.                 insertText "\\hline"
  574.                 for {set i 1} {$i <= $numberRows} {incr i} {
  575.                     carriageReturn
  576.                     insertRow $numberCols
  577.                     insertText "  \\\\"
  578.                     carriageReturn
  579.                     insertText "\\hline"
  580.                 }
  581.                 goto $beginArgument
  582.                 setMark
  583.                 goto $endArgument
  584.                 markHilite
  585.                 message "modify argument?"
  586.             }
  587.         }
  588.     }
  589. }
  590. proc tabbing {} {alertnote "Not yet implemented."}
  591.  
  592. proc figure {} {
  593.     global useBoxMacro
  594.     global boxMacroName
  595.     if {$useBoxMacro} then {
  596.         set currentPos [getPos]
  597.         if {[insertEnvironment "figure" 0]} then {
  598.             insertText "\\centerline{\\$boxMacroName{•}}"
  599.         } else {
  600.             return
  601.         }
  602.     } else {
  603.         if {[wrapEnvironment "figure" 0]} then {
  604.             forwardChar
  605.             backwardChar
  606.             set currentPos [getPos]
  607.         } else {
  608.             set currentPos [getPos]
  609.             insertText "•"
  610.         }
  611.     }
  612.     carriageReturn
  613.     insertText "\\caption{•}"
  614.     carriageReturn
  615.     insertText "\\protect\\label{•}"
  616.     goto $currentPos
  617.     nextTabStop
  618. }
  619. proc table {} {
  620.     if {[wrapEnvironment "table" 0]} then {
  621.         forwardChar
  622.         backwardChar
  623.         set currentPos [getPos]
  624.     } else {
  625.         set currentPos [getPos]
  626.         insertText "•"
  627.     }
  628.     carriageReturn
  629.     insertText "\\caption{•}"
  630.     carriageReturn
  631.     insertText "\\protect\\label{•}"
  632.     goto $currentPos
  633.     nextTabStop
  634. }
  635. proc slide {} {
  636.     wrapEnvironment "slide" 1
  637.     message "enter colors"
  638. }
  639.  
  640. proc verbatim {} {wrapEnvironment "verbatim" 0}
  641. proc quote {} {wrapEnvironment "quote" 0}
  642. proc quotation {} {wrapEnvironment "quotation" 0}
  643. proc verse {} {wrapEnvironment "verse" 0}
  644.  
  645. proc index {} {alertnote "Not yet implemented."}
  646. proc bibliography {} {
  647.     catch {prompt "bibliography:  how many bibitems?" 3} numberItems
  648.     if {$numberItems != "cancel"} then {
  649.         if {[insertEnvironment "thebibliography" 1]} then {
  650.             set beginArgument [getPos]
  651.             insertText "99"
  652.             set endArgument [getPos]
  653.             nextTabStop
  654.             insertText "\\bibitem{•}"
  655.             carriageReturn
  656.             insertText "•"
  657.             for {set i 1} {$i < $numberItems} {incr i} {
  658.                 carriageReturn
  659.                 carriageReturn
  660.                 insertText "\\bibitem{•}"
  661.                 carriageReturn
  662.                 insertText "•"
  663.             }
  664.             goto $beginArgument
  665.             setMark
  666.             goto $endArgument
  667.             markHilite
  668.             message "modify argument?"
  669.         }
  670.     }
  671. }
  672.  
  673. proc general {} {
  674.     catch {prompt "What environment?" "center"} environmentName
  675.     if {$environmentName != "cancel"} {wrapEnvironment $environmentName 0}
  676. }
  677.  
  678. # Boxes:
  679. proc mbox {} {
  680.     if {[wrapObject "\\mbox{" "}•"]} then {
  681.         message "mbox set"
  682.     } else {
  683.         message "enter text"
  684.     }
  685. }
  686. proc fbox {} {alertnote "Not yet implemented."}
  687. proc parbox {} {alertnote "Not yet implemented."}
  688.  
  689. # Misc:
  690. proc ellipsis {} {insertObject "\\ldots"}
  691. proc sectionMark {} {insertObject "\\S"}
  692. proc paragraphMark {} {insertObject "\\P"}
  693. proc dagger {} {insertObject "\\dag"}
  694. proc dblDagger {} {insertObject "\\ddag"}
  695. proc copyright {} {insertObject "\\copyright"}
  696. proc pounds {} {insertObject "\\pounds"}
  697. proc {en-dash} {} {insertObject "--"}
  698. proc {em-dash} {} {insertObject "---"}
  699. proc texLogo {} {insertObject "\\TeX"}
  700. proc latexLogo {} {insertObject "\\LaTeX"}
  701. proc today {} {insertObject "\\today"}
  702.  
  703. proc quotes {} {
  704.     if {[wrapObject "`" "'•"]} then {
  705.         message "text quoted"
  706.     } else {
  707.         message "enter text"
  708.     }
  709. }
  710. proc dblQuotes {} {
  711.     if {[wrapObject "``" "''•"]} then {
  712.         message "text double quoted"
  713.     } else {
  714.         message "enter text"
  715.     }
  716. }
  717. proc note {} {
  718.     if {[wrapObject "\\marginpar{" "}•"]} then {
  719.         message "marginal note set"
  720.     } else {
  721.         message "enter marginal note"
  722.     }
  723. }
  724. proc footnote {} {
  725.     if {[wrapObject "\\footnote{" "}•"]} then {
  726.         message "footnote set"
  727.     } else {
  728.         message "enter footnote"
  729.     }
  730. }
  731. proc label {} {
  732.     if {[wrapObject "\\label{" "}•"]} then {
  733.         message "label defined"
  734.     } else {
  735.         message "enter label"
  736.     }
  737. }
  738. proc crossRef {} { 
  739.     if {[wrapObject "\\ref{" "}•"]} then {
  740.         message "cross-reference made"
  741.     } else {
  742.         message "enter cross-reference"
  743.     }
  744. }
  745. proc pageRef {} { 
  746.     if {[wrapObject "\\pageref{" "}•"]} then {
  747.         message "page reference made"
  748.     } else {
  749.         message "enter page reference"
  750.     }
  751. }
  752. proc citation {} {
  753.     if {[wrapObject "\\cite{" "}•"]} then {
  754.         message "citation made"
  755.     } else {
  756.         message "enter citation"
  757.     }
  758. }
  759. proc item {} {insertObject "\\item"}
  760. proc bibitem {} {
  761.     if {[wrapObject "\\bibitem{" "}•"]} then {
  762.         message "bibitem set"
  763.     } else {
  764.         message "enter bibitem"
  765.     }
  766. }
  767.  
  768.  
  769. #############################################################################
  770. # Math Mode Macros.
  771. #
  772. #############################################################################
  773.  
  774. # Modes:
  775. proc texMath {} {
  776.     if {[wrapObject "$" "$•"]} then {
  777.         message "formula set"
  778.     } else {
  779.         message "enter formula"
  780.     }
  781. }
  782. proc texDisplaymath {} {
  783.     if {[wrapObject "$$" "$$•"]} then {
  784.         message "displayed formula set"
  785.     } else {
  786.         message "enter displayed formula"
  787.     }
  788. }
  789. proc latexMath {} {
  790.     if {[wrapObject "\\( " " \\)•"]} then {
  791.         message "formula set"
  792.     } else {
  793.         message "enter formula"
  794.     }
  795. }
  796. proc latexDisplaymath {} {
  797.     if {[wrapObject "\\\[ " " \\\]•"]} then {
  798.         message "displayed formula set"
  799.     } else {
  800.         message "enter displayed formula"
  801.     }
  802. }
  803.  
  804. # Environments:
  805. proc math {} {wrapEnvironment "math" 0}
  806. proc displaymath {} {wrapEnvironment "displaymath" 0}
  807. proc equation {} {
  808.     if {[wrapEnvironment "equation" 0]} then {
  809.         forwardChar
  810.         backwardChar
  811.         set currentPos [getPos]
  812.     } else {
  813.         set currentPos [getPos]
  814.         insertText "•"
  815.     }
  816.     carriageReturn
  817.     insertText "\\label{•}"
  818.     goto $currentPos
  819.     nextTabStop
  820. }
  821. proc myArray {} {
  822.     catch {prompt "array:  how many rows?" 3} numberRows
  823.     if {$numberRows != "cancel"} then {
  824.         catch {prompt "array:  how many columns?" 3} numberCols
  825.         if {$numberCols != "cancel"} then {
  826.             if {[insertEnvironment "array" 1]} then {
  827.                 set beginArgument [getPos]
  828.                 for {set j 1} {$j <= $numberCols} {incr j} {
  829.                     insertText "c"
  830.                 }
  831.                 set endArgument [getPos]
  832.                 nextTabStop
  833.                 for {set i 1} {$i < $numberRows} {incr i} {
  834.                     insertRow $numberCols
  835.                     insertText "  \\\\"
  836.                     carriageReturn
  837.                 }
  838.                 insertRow $numberCols
  839.                 goto $beginArgument
  840.                 setMark
  841.                 goto $endArgument
  842.                 markHilite
  843.                 message "modify argument?"
  844.             }
  845.         }
  846.     }
  847. }
  848. proc eqnarray {} {
  849.     catch {prompt "eqnarray:  how many rows?" 3} numberRows
  850.     if {$numberRows != "cancel"} then {
  851.         set currentPos [getPos]
  852.         if {[insertEnvironment "eqnarray" 0]} then {
  853.             for {set i 1} {$i < $numberRows} {incr i} {
  854.                 insertRow 3
  855.                 carriageReturn
  856.                 insertText "\\label{•} \\\\"
  857.                 carriageReturn
  858.             }
  859.             insertRow 3
  860.             carriageReturn
  861.             insertText "\\label{•}"
  862.             goto $currentPos
  863.             nextTabStop
  864.         }
  865.     }
  866. }
  867. proc eqnarrayStar {} {
  868.     catch {prompt "eqnarray*:  how many rows?" 3} numberRows
  869.     if {$numberRows != "cancel"} then {
  870.         set currentPos [getPos]
  871.         if {[insertEnvironment "eqnarray*" 0]} then {
  872.             for {set i 1} {$i < $numberRows} {incr i} {
  873.                 insertRow 3
  874.                 insertText "  \\\\"
  875.                 carriageReturn
  876.             }
  877.             insertRow 3
  878.             goto $currentPos
  879.             nextTabStop
  880.         }
  881.     }
  882. }
  883.  
  884. # Formulas:
  885. proc subscript {} {
  886.     if {[wrapObject "_{" "}•"]} then {
  887.         message "subscript set"
  888.     } else {
  889.         message "enter subscript"
  890.     }
  891. }
  892. proc superscript {} {
  893.     if {[wrapObject "^{" "}•"]} then {
  894.         message "superscript set"
  895.     } else {
  896.         message "enter superscript"
  897.     }
  898. }
  899. proc fraction {} {
  900.     set currentPos [getPos]
  901.     if {[isSelection]} then {
  902.         set selection [getSelect]
  903.         set args [split $selection /]
  904.         set len [llength $args]
  905.         deleteText $currentPos [selEnd]
  906.         if {$len == 1} then {
  907.             # maybe the selection should be deleted in this case?
  908.             insertText "\\frac{" $selection "}{•}•"
  909.             goto $currentPos
  910.             nextTabStop
  911.             message "enter denominator"
  912.         } else {
  913.             set firstArg [lindex $args 0]
  914.             set restArgs [lrange $args 1 [expr $len-1]]
  915.             insertText "\\frac{" $firstArg "}{" [join $restArgs /] "}"
  916.             if {$len > 2} {message "beware of multiple /"}
  917.         }
  918.     } else {
  919.         insertText "\\frac{•}{•}•"
  920.         goto $currentPos
  921.         nextTabStop
  922.         message "enter numerator"
  923.     }
  924. }
  925. proc squareRoot {} {
  926.     if {[wrapObject "\\sqrt{" "}•"]} then {
  927.         message "square root set"
  928.     } else {
  929.         message "enter formula"
  930.     }
  931. }
  932. proc nthRoot {} {
  933.     if {[wrapObject "\\sqrt\[•\]{" "}•"]} then {
  934.         message "enter root"
  935.     } else {
  936.         message "enter root, then formula"
  937.     }
  938. }
  939. proc oneParameter {} {
  940.     catch {prompt "Command name?" "sqrt"} commandName
  941.     if {$commandName != "cancel"} {wrapObject "\\$commandName{" "}•"}
  942. }
  943. proc twoParameters {} {
  944.     catch {prompt "Command name?" "frac"} commandName
  945.     if {$commandName != "cancel"} then {
  946.         set currentPos [getPos]
  947.         if {[insertObject "\\$commandName{•}{•}•"]} then {
  948.             goto $currentPos
  949.             nextTabStop
  950.         }
  951.     }
  952. }
  953.  
  954. # Greek:
  955. proc alpha {} {insertObject "\\alpha"}
  956. proc beta {} {insertObject "\\beta"}
  957. proc gamma {} {insertObject "\\gamma"}
  958. proc delta {} {insertObject "\\delta"}
  959. proc epsilon {} {insertObject "\\epsilon"}
  960. proc zeta {} {insertObject "\\zeta"}
  961. proc eta {} {insertObject "\\eta"}
  962. proc theta {} {insertObject "\\theta"}
  963. proc iota {} {insertObject "\\iota"}
  964. proc kappa {} {insertObject "\\kappa"}
  965. proc lambda {} {insertObject "\\lambda"}
  966. proc mu {} {insertObject "\\mu"}
  967. proc nu {} {insertObject "\\nu"}
  968. proc xi {} {insertObject "\\xi"}
  969. proc pi {} {insertObject "\\pi"}
  970. proc rho {} {insertObject "\\rho"}
  971. proc sigma {} {insertObject "\\sigma"}
  972. proc tau {} {insertObject "\\tau"}
  973. proc upsilon {} {insertObject "\\upsilon"}
  974. proc phi {} {insertObject "\\phi"}
  975. proc chi {} {insertObject "\\chi"}
  976. proc psi {} {insertObject "\\psi"}
  977. proc omega {} {insertObject "\\omega"}
  978.  
  979. proc capGamma {} {insertObject "\\Gamma"}
  980. proc capDelta {} {insertObject "\\Delta"}
  981. proc capTheta {} {insertObject "\\Theta"}
  982. proc capLambda {} {insertObject "\\Lambda"}
  983. proc capXi {} {insertObject "\\Xi"}
  984. proc capPi {} {insertObject "\\Pi"}
  985. proc capSigma {} {insertObject "\\Sigma"}
  986. proc capUpsilon {} {insertObject "\\Upsilon"}
  987. proc capPhi {} {insertObject "\\Phi"}
  988. proc capPsi {} {insertObject "\\Psi"}
  989. proc capOmega {} {insertObject "\\Omega"}
  990.  
  991. proc varEpsilon {} {insertObject "\\varepsilon"}
  992. proc varTheta {} {insertObject "\\vartheta"}
  993. proc varPi {} {insertObject "\\varpi"}
  994. proc varRho {} {insertObject "\\varrho"}
  995. proc varSigma {} {insertObject "\\varsigma"}
  996. proc varPhi {} {insertObject "\\varphi"}
  997.  
  998. # Binary Ops:
  999. proc plusOrMinus {} {insertObject "\\pm"}
  1000. proc minusOrPlus {} {insertObject "\\mp"}
  1001. proc multiply {} {insertObject "\\times"}
  1002. proc divide {} {insertObject "\\div"}
  1003. proc asterisk {} {insertObject "\\ast"}
  1004. proc star {} {insertObject "\\star"}
  1005. proc circle {} {insertObject "\\circ"}
  1006. proc bigCircle {} {insertObject "\\bigcirc"}
  1007. proc bullet {} {insertObject "\\bullet"}
  1008. proc centerDot {} {insertObject "\\cdot"}
  1009. proc intersection {} {insertObject "\\cap"}
  1010. proc union {} {insertObject "\\cup"}
  1011. proc logicalAnd {} {insertObject "\\wedge"}
  1012. proc logicalOr {} {insertObject "\\vee"}
  1013. proc setMinus {} {insertObject "\\setminus"}
  1014.  
  1015. # Relations:
  1016. proc notEqual {} {insertObject "\\neq"}
  1017. proc lessOrEqual {} {insertObject "\\leq"}
  1018. proc greaterOrEqual {} {insertObject "\\geq"}
  1019. proc subset {} {insertObject "\\subset"}
  1020. proc superset {} {insertObject "\\supset"}
  1021. proc subsetOrEqual {} {insertObject "\\subseteq"}
  1022. proc supersetOrEqual {} {insertObject "\\supseteq"}
  1023. proc elementOf {} {insertObject "\\in"}
  1024. proc equivalent {} {insertObject "\\equiv"}
  1025. proc similar {} {insertObject "\\sim"}
  1026. proc similarEqual {} {insertObject "\\simeq"}
  1027. proc dotEqual {} {insertObject "\\doteq"}
  1028. proc approximate {} {insertObject "\\approx"}
  1029. proc congruent {} {insertObject "\\cong"}
  1030.  
  1031. # Large Ops:
  1032. proc insertLargeOp {commandName} {
  1033.     set currentPos [getPos]
  1034.     insertText "\\$commandName"
  1035.     insertText "_{•}^{•}•"
  1036.     goto $currentPos
  1037.     nextTabStop
  1038. }
  1039. proc sum {} {insertLargeOp "sum"}
  1040. proc product {} {insertLargeOp "prod"}
  1041. proc integral {} {insertLargeOp "int"}
  1042. proc bigUnion {} {insertLargeOp "bigcup"}
  1043. proc bigIntersection {} {insertLargeOp "bigcap"}
  1044. proc bigAnd {} {insertLargeOp "bigwedge"}
  1045. proc bigOr {} {insertLargeOp "bigvee"}
  1046.  
  1047. # Arrows:
  1048. proc mapsTo {} {insertObject "\\mapsto"}
  1049. proc leftArrow {} {insertObject "\\leftarrow"}
  1050. proc rightArrow {} {insertObject "\\rightarrow"}
  1051. proc {left-rightArrow} {} {insertObject "\\leftrightarrow"}
  1052. proc dblLeftArrow {} {insertObject "\\Leftarrow"}
  1053. proc dblRightArrow {} {insertObject "\\Rightarrow"}
  1054. proc {dblLeft-rightArrow} {} {insertObject "\\Leftrightarrow"}
  1055.  
  1056. # Dots:
  1057. proc centerDots {} {insertObject "\\cdots"}
  1058. proc verticalDots {} {insertObject "\\vdots"}
  1059. proc diagonalDots {} {insertObject "\\ddots"}
  1060.  
  1061. # Symbols:
  1062. proc aleph {} {insertObject "\\aleph"}
  1063. proc emptySet {} {insertObject "\\emptyset"}
  1064. proc negation {} {insertObject "\\neg"}
  1065. proc forAll {} {insertObject "\\forall"}
  1066. proc exists {} {insertObject "\\exists"}
  1067. proc scriptL {} {insertObject "\\ell"}
  1068. proc nabla {} {insertObject "\\nabla"}
  1069. proc partial {} {insertObject "\\partial"}
  1070. proc infinity {} {insertObject "\\infty"}
  1071. proc backslash {} {insertObject "\\backslash"}
  1072. proc angle {} {insertObject "\\angle"}
  1073. proc box {} {insertObject "\\Box"}
  1074. proc diamond {} {insertObject "\\Diamond"}
  1075. proc triangle {} {insertObject "\\triangle"}
  1076.  
  1077. # Functions:  not yet implemented.
  1078.  
  1079. # Delimiters:
  1080. proc parentheses {} {
  1081.     if {[wrapObject "(" ")•"]} then {
  1082.         message "formula delimited"
  1083.     } else {
  1084.         message "enter formula"
  1085.     }
  1086. }
  1087. proc brackets {} {
  1088.     if {[wrapObject "\[" "\]•"]} then {
  1089.         message "formula delimited"
  1090.     } else {
  1091.         message "enter formula"
  1092.     }
  1093. }
  1094. proc braces {} {
  1095.     if {[wrapObject "\\\{" "\\\}•"]} then {
  1096.         message "formula delimited"
  1097.     } else {
  1098.         message "enter formula"
  1099.     }
  1100. }
  1101. proc absoluteValue {} {
  1102.     if {[wrapObject "|" "|•"]} then {
  1103.         message "formula delimited"
  1104.     } else {
  1105.         message "enter formula"
  1106.     }
  1107. }
  1108. proc otherDelims {} {
  1109.     catch {prompt "Choose delimiters:" "parentheses" "" "parentheses" "brackets" "braces" "angle brackets" "vertical bars" "double bars" "ceiling" "floor"} delimType
  1110.     if {$delimType != "cancel"} then {
  1111.         case $delimType in {
  1112.             "parentheses" {
  1113.                 set leftDelim "("
  1114.                 set rightDelim ")"
  1115.             }
  1116.             "brackets" {
  1117.                 set leftDelim "\["
  1118.                 set rightDelim "\]"
  1119.             }
  1120.             "braces" {
  1121.                 set leftDelim "\\\{"
  1122.                 set rightDelim "\\\}"
  1123.             }
  1124.             "{angle brackets}" {
  1125.                 set leftDelim "\\langle"
  1126.                 set rightDelim "\\rangle"
  1127.             }
  1128.             "{vertical bars}" {
  1129.                 set leftDelim "|"
  1130.                 set rightDelim "|"
  1131.             }
  1132.             "{double bars}" {
  1133.                 set leftDelim "\\|"
  1134.                 set rightDelim "\\|"
  1135.             }
  1136.             "ceiling" {
  1137.                 set leftDelim "\\lceil"
  1138.                 set rightDelim "\\rceil"
  1139.             }
  1140.             "floor" {
  1141.                 set leftDelim "\\lfloor"
  1142.                 set rightDelim "\\rfloor"
  1143.             }
  1144.             default {
  1145.                 alertnote "\"$delimType\" not recognized"
  1146.                 return
  1147.             }
  1148.         }
  1149.         if {[wrapObject "$leftDelim" "$rightDelim•"]} then {
  1150.             message "formula delimited"
  1151.         } else {
  1152.             message "enter formula"
  1153.         }
  1154.     }
  1155. }
  1156.  
  1157. proc {half-openInterval} {} {
  1158.     if {[wrapObject "(" "\]•"]} then {
  1159.         message "formula delimited"
  1160.     } else {
  1161.         message "enter formula"
  1162.     }
  1163. }
  1164. proc {half-closedInterval} {} {
  1165.     if {[wrapObject "\[" ")•"]} then {
  1166.         message "formula delimited"
  1167.     } else {
  1168.         message "enter formula"
  1169.     }
  1170. }
  1171.  
  1172. proc bigParentheses {} {
  1173.     if {[wrapObject "\\left(" "\\right)•"]} then {
  1174.         message "formula delimited"
  1175.     } else {
  1176.         message "enter formula"
  1177.     }
  1178. }
  1179. proc bigBrackets {} {
  1180.     if {[wrapObject "\\left\[" "\\right\]•"]} then {
  1181.         message "formula delimited"
  1182.     } else {
  1183.         message "enter formula"
  1184.     }
  1185. }
  1186. proc bigBraces {} {
  1187.     if {[wrapObject "\\left\\\{" "\\right\\\}•"]} then {
  1188.         message "formula delimited"
  1189.     } else {
  1190.         message "enter formula"
  1191.     }
  1192. }
  1193. proc bigAbsoluteValue {} {
  1194.     if {[wrapObject "\\left|" "\\right|•"]} then {
  1195.         message "formula delimited"
  1196.     } else {
  1197.         message "enter formula"
  1198.     }
  1199. }
  1200. proc otherBigDelims {} {
  1201.     catch {prompt "Choose delimiters:" "parentheses" "" "parentheses" "brackets" \
  1202.                 "braces" "angle brackets" "vertical bars" "double bars" \
  1203.                 "ceiling" "floor"} delimType
  1204.     if {$delimType != "cancel"} then {
  1205.         case $delimType in {
  1206.             "parentheses" {
  1207.                 set leftDelim "("
  1208.                 set rightDelim ")"
  1209.             }
  1210.             "brackets" {
  1211.                 set leftDelim "\["
  1212.                 set rightDelim "\]"
  1213.             }
  1214.             "braces" {
  1215.                 set leftDelim "\\\{"
  1216.                 set rightDelim "\\\}"
  1217.             }
  1218.             "{angle brackets}" {
  1219.                 set leftDelim "\\langle"
  1220.                 set rightDelim "\\rangle"
  1221.             }
  1222.             "{vertical bars}" {
  1223.                 set leftDelim "|"
  1224.                 set rightDelim "|"
  1225.             }
  1226.             "{double bars}" {
  1227.                 set leftDelim "\\|"
  1228.                 set rightDelim "\\|"
  1229.             }
  1230.             "ceiling" {
  1231.                 set leftDelim "\\lceil"
  1232.                 set rightDelim "\\rceil"
  1233.             }
  1234.             "floor" {
  1235.                 set leftDelim "\\lfloor"
  1236.                 set rightDelim "\\rfloor"
  1237.             }
  1238.             default {
  1239.                 alertnote "\"$delimType\" not recognized"
  1240.                 return
  1241.             }
  1242.         }
  1243.         if {[wrapObject "\\left$leftDelim" "\\right$rightDelim•"]} then {
  1244.             message "formula delimited"
  1245.         } else {
  1246.             message "enter formula"
  1247.         }
  1248.     }
  1249. }
  1250.  
  1251. proc bigLeftBrace {} {
  1252.     if {[wrapObject "\\left\\\{" "\\right.•"]} then {
  1253.         message "formula delimited"
  1254.     } else {
  1255.         message "enter formula"
  1256.     }
  1257. }
  1258. proc otherMixedBigDelims {} {
  1259.     catch {prompt "Choose left delimiter:" "parenthesis" "" "parenthesis" "bracket" \
  1260.              "brace" "angle bracket" "vertical bar" "double bar" "ceiling" "floor"  \
  1261.              "slash" "backslash" "none"} delimType
  1262.     if {$delimType != "cancel"} then {
  1263.         case $delimType in {
  1264.             "parenthesis" {set leftDelim "("}
  1265.             "bracket" {set leftDelim "\["}
  1266.             "brace" {set leftDelim "\\\{"}
  1267.             "{angle bracket}" {set leftDelim "\\langle"}
  1268.             "{vertical bar}" {set leftDelim "|"}
  1269.             "{double bar}" {set leftDelim "\\|"}
  1270.             "ceiling" {set leftDelim "\\lceil"}
  1271.             "floor" {set leftDelim "\\lfloor"}
  1272.             "slash" {set leftDelim "/"}
  1273.             "backslash" {set leftDelim "\\backslash"}
  1274.             "none" {set leftDelim "."}
  1275.             default {
  1276.                 alertnote "\"$delimType\" not recognized"
  1277.                 return
  1278.             }
  1279.         }
  1280.         catch {prompt "Choose right delimiter:" "parenthesis" "" "parenthesis" "bracket" \
  1281.                 "brace" "angle bracket" "vertical bar" "double bar" "ceiling" "floor" \
  1282.                 "slash" "backslash" "none"} delimType
  1283.         if {$delimType != "cancel"} then {
  1284.             case $delimType in {
  1285.                 "parenthesis" {set rightDelim ")"}
  1286.                 "bracket" {set rightDelim "\]"}
  1287.                 "brace" {set rightDelim "\\\}"}
  1288.                 "{angle bracket}" {set rightDelim "\\rangle"}
  1289.                 "{vertical bar}" {set rightDelim "|"}
  1290.                 "{double bar}" {set rightDelim "\\|"}
  1291.                 "ceiling" {set rightDelim "\\rceil"}
  1292.                 "floor" {set rightDelim "\\rfloor"}
  1293.                 "slash" {set rightDelim "/"}
  1294.                 "backslash" {set rightDelim "\\backslash"}
  1295.                 "none" {set rightDelim "."}
  1296.                 default {
  1297.                     alertnote "\"$delimType\" not recognized"
  1298.                     return
  1299.                 }
  1300.             }
  1301.             if {[wrapObject "\\left$leftDelim" "\\right$rightDelim•"]} then {
  1302.                 message "formula delimited"
  1303.             } else {
  1304.                 message "enter formula"
  1305.             }
  1306.         }
  1307.     }
  1308. }
  1309.  
  1310. # Accents:
  1311. proc hat {} {
  1312.     if {[isSelection] > 1} then {
  1313.         beep
  1314.         alertnote "Warning: only a single character may be accented!"
  1315.     }
  1316.     if {[wrapObject "\\hat{" "}•"]} then {
  1317.         message "accent set"
  1318.     } else {
  1319.         message "enter one character"
  1320.     }
  1321. }
  1322. proc check {} {
  1323.     if {[isSelection] > 1} then {
  1324.         beep
  1325.         alertnote "Warning: only a single character may be accented!"
  1326.     }
  1327.     if {[wrapObject "\\check{" "}•"]} then {
  1328.         message "accent set"
  1329.     } else {
  1330.         message "enter one character"
  1331.     }
  1332. }
  1333. proc breve {} {
  1334.     if {[isSelection] > 1} then {
  1335.         beep
  1336.         alertnote "Warning: only a single character may be accented!"
  1337.     }
  1338.     if {[wrapObject "\\breve{" "}•"]} then {
  1339.         message "accent set"
  1340.     } else {
  1341.         message "enter one character"
  1342.     }
  1343. }
  1344. proc acuteAccent {} {
  1345.     if {[isSelection] > 1} then {
  1346.         beep
  1347.         alertnote "Warning: only a single character may be accented!"
  1348.     }
  1349.     if {[wrapObject "\\acute{" "}•"]} then {
  1350.         message "accent set"
  1351.     } else {
  1352.         message "enter one character"
  1353.     }
  1354. }
  1355. proc graveAccent {} {
  1356.     if {[isSelection] > 1} then {
  1357.         beep
  1358.         alertnote "Warning: only a single character may be accented!"
  1359.     }
  1360.     if {[wrapObject "\\grave{" "}•"]} then {
  1361.         message "accent set"
  1362.     } else {
  1363.         message "enter one character"
  1364.     }
  1365. }
  1366. proc tilde {} {
  1367.     if {[isSelection] > 1} then {
  1368.         beep
  1369.         alertnote "Warning: only a single character may be accented!"
  1370.     }
  1371.     if {[wrapObject "\\tilde{" "}•"]} then {
  1372.         message "accent set"
  1373.     } else {
  1374.         message "enter one character"
  1375.     }
  1376. }
  1377. proc bar {} {
  1378.     if {[isSelection] > 1} then {
  1379.         beep
  1380.         alertnote "Warning: only a single character may be accented!"
  1381.     }
  1382.     if {[wrapObject "\\bar{" "}•"]} then {
  1383.         message "accent set"
  1384.     } else {
  1385.         message "enter one character"
  1386.     }
  1387. }
  1388. proc vector {} {
  1389.     if {[isSelection] > 1} then {
  1390.         beep
  1391.         alertnote "Warning: only a single character may be accented!"
  1392.     }
  1393.     if {[wrapObject "\\vec{" "}•"]} then {
  1394.         message "accent set"
  1395.     } else {
  1396.         message "enter one character"
  1397.     }
  1398. }
  1399. proc dot {} {
  1400.     if {[isSelection] > 1} then {
  1401.         beep
  1402.         alertnote "Warning: only a single character may be accented!"
  1403.     }
  1404.     if {[wrapObject "\\dot{" "}•"]} then {
  1405.         message "accent set"
  1406.     } else {
  1407.         message "enter one character"
  1408.     }
  1409. }
  1410. proc dblDot {} {
  1411.     if {[isSelection] > 1} then {
  1412.         beep
  1413.         alertnote "Warning: only a single character may be accented!"
  1414.     }
  1415.     if {[wrapObject "\\ddot{" "}•"]} then {
  1416.         message "accent set"
  1417.     } else {
  1418.         message "enter one character"
  1419.     }
  1420. }
  1421.  
  1422. proc wideHat {} {
  1423.     if {[isSelection] > 3} then {
  1424.         beep
  1425.         alertnote "Warning: only a few characters may be accented!"
  1426.     }
  1427.     if {[wrapObject "\\widehat{" "}•"]} then {
  1428.         message "accent set"
  1429.     } else {
  1430.         message "enter a few characters"
  1431.     }
  1432. }
  1433. proc wideTilde {} {
  1434.     if {[isSelection] > 3} then {
  1435.         beep
  1436.         alertnote "Warning: only a few characters may be accented!"
  1437.     }
  1438.     if {[wrapObject "\\widetilde{" "}•"]} then {
  1439.         message "accent set"
  1440.     } else {
  1441.         message "enter a few characters"
  1442.     }
  1443. }
  1444.  
  1445. proc dotlessI {} {insertObject "\\imath"}
  1446. proc dotlessJ {} {insertObject "\\jmath"}
  1447.  
  1448. # Grouping:
  1449. proc underline {} {
  1450.     if {[wrapObject "\\underline{" "}•"]} then {
  1451.         message "selection underlined"
  1452.     } else {
  1453.         message "enter text"
  1454.     }
  1455. }
  1456. proc overline {} {
  1457.     if {[wrapObject "\\overline{" "}•"]} then {
  1458.         message "selection overlined"
  1459.     } else {
  1460.         message "enter text"
  1461.     }
  1462. }
  1463. proc underbrace {} {
  1464.     if {[wrapObject "\\underbrace{" "}•"]} then {
  1465.         message "selection underbraced"
  1466.     } else {
  1467.         message "enter text"
  1468.     }
  1469. }
  1470. proc overbrace {} {
  1471.     if {[wrapObject "\\overbrace{" "}•"]} then {
  1472.         message "selection overbraced"
  1473.     } else {
  1474.         message "enter text"
  1475.     }
  1476. }
  1477. proc stack {} {
  1478.     set currentPos [getPos]
  1479.     if {[insertObject "\\stackrel{•}{•}•"]} then {
  1480.         goto $currentPos
  1481.         nextTabStop
  1482.         message "1st arg scriptstyle"
  1483.     }
  1484. }
  1485.  
  1486. # Spacing:
  1487. proc thin {} {insertObject "\\,"}
  1488. proc negThin {} {insertObject "\\!"}
  1489. proc medium {} {insertObject "\\:"}
  1490. proc thick {} {insertObject "\\;"}
  1491. proc quad {} {insertObject "\\quad"}
  1492. proc dblQuad {} {insertObject "\\qquad"}
  1493.  
  1494. # Math Style:
  1495. proc mathItalic {} {
  1496.     if {[wrapObject "{\\mit " "}•"]} then {
  1497.         message "math italics set"
  1498.     } else {
  1499.         message "enter italicized text"
  1500.     }
  1501. }
  1502. proc calligraphic {} {
  1503.     # Check for upper-case arguments only:
  1504.     if {[wrapObject "{\\cal " "}•"]} then {
  1505.         message "calligraphics set"
  1506.     } else {
  1507.         message "enter text"
  1508.     }
  1509. }
  1510. proc fraktur {} {
  1511.     alertnote "Not yet implemented."
  1512. }
  1513. proc script {} {
  1514.     alertnote "Not yet implemented."
  1515. }
  1516. proc blackboardBold {} {
  1517.     alertnote "Not yet implemented."
  1518. }
  1519. proc displayStyle {} {
  1520.     if {[wrapObject "{\\displaystyle " "}•"]} then {
  1521.         message "displaystyle set"
  1522.     } else {
  1523.         message "enter displaystyle text"
  1524.     }
  1525. }
  1526. proc textStyle {} {
  1527.     if {[wrapObject "{\\textstyle " "}•"]} then {
  1528.         message "textstyle set"
  1529.     } else {
  1530.         message "enter textstyle text"
  1531.     }
  1532. }
  1533. proc scriptStyle {} {
  1534.     if {[wrapObject "{\\scriptstyle " "}•"]} then {
  1535.         message "scriptstyle set"
  1536.     } else {
  1537.         message "enter scriptstyle text"
  1538.     }
  1539. }
  1540. proc scriptscriptStyle {} {
  1541.     if {[wrapObject "{\\scriptscriptstyle " "}•"]} then {
  1542.         message "scriptscriptstyle set"
  1543.     } else {
  1544.         message "enter scriptscriptstyle text"
  1545.     }
  1546. }
  1547.  
  1548.  
  1549. #############################################################################
  1550. #
  1551. # LaTeX Menu Definition.
  1552. #
  1553. #############################################################################
  1554.  
  1555. proc interpretMenuItem {menu item} {
  1556.     switch $item {
  1557.         "list" {set func "myList"}
  1558.         "array" {set func "myArray"}
  1559.         "eqnarray\*" {set func "eqnarrayStar"}
  1560.         default {set func $item}
  1561.     }
  1562.     eval $func
  1563. }
  1564.  
  1565. # LaTeX mode
  1566. proc setTexMode {} {
  1567.     global latexMenu
  1568.     changeMode "TeX"
  1569.     uplevel #0 {    
  1570.         set wordBreakPreface {[^a-zA-Z0-9]}
  1571.         set wordBreak {[a-zA-Z0-9]+}
  1572.         set elecLBrace 0
  1573.         set elecRBrace 0
  1574.         set electricSemi 0
  1575.         set wordWrap 1
  1576.         set prefixString "% "
  1577.         set suffixString { \\\\}
  1578.         set sortedIsDefault 0
  1579.         set funcExpr {^\\(sub)*section\*?{([^{}]*)}}
  1580. #        set funcExpr {^\\(sub)*section\*?{(.*)}$}
  1581.         set funcPar 2
  1582.         set savedIsMeta $optionIsMeta
  1583. #    Uncomment next line to use option key in Tex bindings.
  1584. #        set optionIsMeta 0
  1585. #    Next is a call to a random proc in the latex file to make sure
  1586. #    is it auto-loaded.
  1587.         isSelection
  1588.         insertMenu $latexMenu
  1589.     }
  1590. }
  1591.  
  1592. #================================================================================
  1593. set latexMenu "•266"
  1594. proc latex {} {
  1595.     global latexPath
  1596.     set sig ""
  1597.     catch {string trim [lindex [getfinfo $latexPath] 1] '} sig
  1598.     set name [checkRunning latex $sig latexPath]
  1599.     if {![string length $name]} return
  1600.     switchTo $name
  1601. }
  1602.  
  1603. proc commentLine {} {
  1604.     beginningOfLine
  1605.     insertText "% "
  1606.     nextLine
  1607.     beginningOfLine
  1608. }
  1609.  
  1610. # Open file in same directory, expect name w/o extension selected.
  1611. proc openInputFile {} {
  1612.     set text [getSelect].tex
  1613.     if {[string length $text] < 5} { beep; return }
  1614.     foreach f [winNames] {
  1615.         if {$f == $text} {
  1616.             bringToFront $f
  1617.             return
  1618.         }
  1619.     }
  1620.     edit [file dirname [lindex [winNames -f] 0]]:$text
  1621. }
  1622.  
  1623.  
  1624. menu -n $latexMenu  {
  1625.     "/-latex"
  1626.     "openInputFile"
  1627.     "(-"
  1628.     {menu -n Documents -p interpretMenuItem {
  1629.         "letter"
  1630.         "article"
  1631.         "report"
  1632.         "book"
  1633.         "(-"
  1634.         "custom…"}
  1635.     }
  1636.     
  1637.     {menu -n Sectioning -p interpretMenuItem {
  1638.         "part"
  1639.         "chapter"
  1640.         "section"
  1641.         "subsection"
  1642.         "subsubsection"
  1643.         "paragraph"
  1644.         "subparagraph"}
  1645.     }
  1646.     
  1647.     {menu -n (Definitions -p interpretMenuItem {
  1648.         "list…"
  1649.         "(-"
  1650.         "newcommand…"
  1651.         "newenvironment…"
  1652.         "newtheorem…"
  1653.         "(-"
  1654.         "renewcommand…"
  1655.         "renewenvironment…"}
  1656.     }
  1657.     
  1658.     "(-"
  1659.     
  1660.     {menu -n TextStyle -p interpretMenuItem {
  1661.         "roman"
  1662.         "bold"
  1663.         "italic"
  1664.         "emphatic"
  1665.         "slanted"
  1666.         "sansSerif"
  1667.         "smallCaps"
  1668.         "typewriter"}
  1669.     }
  1670.     
  1671.     {menu -n TextSize -p interpretMenuItem {
  1672.         "tiny"
  1673.         "smallest"
  1674.         "smaller"
  1675.         "small"
  1676.         "normal"
  1677.         "large"
  1678.         "larger"
  1679.         "largest"
  1680.         "huge"
  1681.         "gigantic"}
  1682.     }
  1683.     
  1684.     {menu -n (International -p interpretMenuItem {
  1685.         }
  1686.     }
  1687.     
  1688.     {menu -n Environments -p interpretMenuItem {
  1689.         "enumerate…"
  1690.         "itemize…"
  1691.         "description…"
  1692.         "(-"
  1693.         "tabular…"
  1694.         "(tabbing"
  1695.         "(-"
  1696.         "figure"
  1697.         "table"
  1698.         "slide"
  1699.         "(-"
  1700.         "verbatim"
  1701.         "quote"
  1702.         "quotation"
  1703.         "verse"
  1704.         "(-"
  1705.         "(index…"
  1706.         "bibliography…"
  1707.         "(-"
  1708.         "general…"}
  1709.     }
  1710.     
  1711.     {menu -n Boxes -p interpretMenuItem {
  1712.         "mbox"
  1713.         "(fbox"
  1714.         "(parbox"}
  1715.     }
  1716.     
  1717.     {menu -n Miscellaneous -p interpretMenuItem {
  1718.         "ellipsis"
  1719.         "sectionMark"
  1720.         "paragraphMark"
  1721.         "dagger"
  1722.         "dblDagger"
  1723.         "en-dash"
  1724.         "em-dash"
  1725.         "texLogo"
  1726.         "latexLogo"
  1727.         "copyright"
  1728.         "pounds"
  1729.         "today"
  1730.         "(-"
  1731.         "quotes"
  1732.         "dblQuotes"
  1733.         "(-"
  1734.         "note"
  1735.         "footnote"
  1736.         "(-"
  1737.         "label"
  1738.         "crossRef"
  1739.         "pageRef"
  1740.         "citation"
  1741.         "(-"
  1742.         "item"
  1743.         "bibitem"
  1744.         }
  1745.     }
  1746.     
  1747.     "(-"
  1748.     
  1749.     {menu -n mathModes -p interpretMenuItem {
  1750.         "texMath"
  1751.         "texDisplaymath"
  1752.         "(-"
  1753.         "latexMath"
  1754.         "latexDisplaymath"}
  1755.     }
  1756.     
  1757.     {menu -n mathEnvironments -p interpretMenuItem {
  1758.         "math"
  1759.         "displaymath"
  1760.         "equation"
  1761.         "(-"
  1762.         "array…"
  1763.         "eqnarray…"
  1764.         "eqnarray*…"
  1765.         "(-"
  1766.         "general…"}
  1767.     }
  1768.     
  1769.     {menu -n Formulas -p interpretMenuItem {
  1770.         "subscript"
  1771.         "superscript"
  1772.         "fraction"
  1773.         "squareRoot"
  1774.         "nthRoot"
  1775.         "(-"
  1776.         "oneParameter…"
  1777.         "twoParameters…"
  1778.         }
  1779.     }
  1780.     
  1781.     {menu -n Greek -p interpretMenuItem {
  1782.         "alpha"
  1783.         "beta"
  1784.         "gamma"
  1785.         "delta"
  1786.         "epsilon"
  1787.         "zeta"
  1788.         "eta"
  1789.         "theta"
  1790.         "iota"
  1791.         "kappa"
  1792.         "lambda"
  1793.         "mu"
  1794.         "nu"
  1795.         "xi"
  1796.         "pi"
  1797.         "rho"
  1798.         "sigma"
  1799.         "tau"
  1800.         "upsilon"
  1801.         "phi"
  1802.         "chi"
  1803.         "psi"
  1804.         "omega"
  1805.         }
  1806.     }
  1807.     {menu -n Greek2 -p interpretMenuItem {
  1808.         "capGamma"
  1809.         "capDelta"
  1810.         "capTheta"
  1811.         "capLambda"
  1812.         "capXi"
  1813.         "capPi"
  1814.         "capSigma"
  1815.         "capUpsilon"
  1816.         "capPhi"
  1817.         "capPsi"
  1818.         "capOmega"
  1819.         "(-"
  1820.         "varEpsilon"
  1821.         "varTheta"
  1822.         "varPi"
  1823.         "varRho"
  1824.         "varSigma"
  1825.         "varPhi"
  1826.         }
  1827.     }
  1828.         
  1829.     {menu -n BinaryOperators -p interpretMenuItem {
  1830.         "plusOrMinus"
  1831.         "minusOrPlus"
  1832.         "multiply"
  1833.         "divide"
  1834.         "asterisk"
  1835.         "star"
  1836.         "centerDot"
  1837.         "bullet"
  1838.         "circle"
  1839.         "bigCircle"
  1840.         "intersection"
  1841.         "union"
  1842.         "logicalAnd"
  1843.         "logicalOr"
  1844.         "setMinus"
  1845.         }
  1846.     }
  1847.     
  1848.     {menu -n Relations -p interpretMenuItem {
  1849.         "notEqual"
  1850.         "lessOrEqual"
  1851.         "greaterOrEqual"
  1852.         "subset"
  1853.         "superset"
  1854.         "subsetOrEqual"
  1855.         "supersetOrEqual"
  1856.         "elementOf"
  1857.         "equivalent"
  1858.         "similar"
  1859.         "similarEqual"
  1860.         "dotEqual"
  1861.         "approximate"
  1862.         "congruent"
  1863.         }
  1864.     }
  1865.     
  1866.     {menu -n LargeOperators -p interpretMenuItem {
  1867.         "sum"
  1868.         "product"
  1869.         "integral"
  1870.         "bigUnion"
  1871.         "bigIntersection"
  1872.         "bigAnd"
  1873.         "bigOr"
  1874.         }
  1875.     }
  1876.     
  1877.     {menu -n Arrows -p interpretMenuItem {
  1878.         "mapsTo"
  1879.         "leftArrow"
  1880.         "rightArrow"
  1881.         "left-rightArrow"
  1882.         "dblLeftArrow"
  1883.         "dblRightArrow"
  1884.         "dblLeft-rightArrow"
  1885.         }
  1886.     }
  1887.     
  1888.     {menu -n Dots -p interpretMenuItem {
  1889.         "centerDot"
  1890.         "bullet"
  1891.         "(-"
  1892.         "ellipsis"
  1893.         "centerDots"
  1894.         "verticalDots"
  1895.         "diagonalDots"
  1896.         }
  1897.     }
  1898.     
  1899.     {menu -n Symbols -p interpretMenuItem {
  1900.         "aleph"
  1901.         "emptySet"
  1902.         "negation"
  1903.         "forAll"
  1904.         "exists"
  1905.         "scriptL"
  1906.         "nabla"
  1907.         "partial"
  1908.         "infinity"
  1909.         "backslash"
  1910.         "angle"
  1911.         "box"
  1912.         "diamond"
  1913.         "triangle"
  1914.         }
  1915.     }
  1916.         
  1917.     {menu -n (Functions -p interpretMenuItem {
  1918.         }
  1919.     }
  1920.  
  1921.     {menu -n Delimiters -p interpretMenuItem {
  1922.         "parentheses"
  1923.         "brackets"
  1924.         "braces"
  1925.         "absoluteValue"
  1926.         "otherDelims…"
  1927.         "(-"
  1928.         "half-openInterval"
  1929.         "half-closedInterval"
  1930.         "(-"
  1931.         "bigParentheses"
  1932.         "bigBrackets"
  1933.         "bigBraces"
  1934.         "bigAbsoluteValue"
  1935.         "otherBigDelims…"
  1936.         "(-"
  1937.         "bigLeftBrace"
  1938.         "otherMixedBigDelims…"
  1939.         }
  1940.     }
  1941.         
  1942.     {menu -n mathAccents -p interpretMenuItem {
  1943.         "hat"
  1944.         "check"
  1945.         "breve"
  1946.         "acuteAccent"
  1947.         "graveAccent"
  1948.         "tilde"
  1949.         "bar"
  1950.         "vector"
  1951.         "dot"
  1952.         "dblDot"
  1953.         "(-"
  1954.         "wideHat"
  1955.         "wideTilde"
  1956.         "(-"
  1957.         "dotlessI"
  1958.         "dotlessJ"
  1959.         }
  1960.     }
  1961.     
  1962.     {menu -n Grouping -p interpretMenuItem {
  1963.         "underline"
  1964.         "overline"
  1965.         "underbrace"
  1966.         "overbrace"
  1967.         "(-"
  1968.         "stack"
  1969.         }
  1970.     }
  1971.     
  1972.     {menu -n Spacing -p interpretMenuItem {
  1973.         "thin"
  1974.         "negThin"
  1975.         "medium"
  1976.         "thick"
  1977.         "(-"
  1978.         "quad"
  1979.         "dblQuad"
  1980.         }
  1981.     }
  1982.     
  1983.     {menu -n MathStyle -p interpretMenuItem {
  1984.         "mathItalic"
  1985.         "calligraphic"
  1986.         "(-"
  1987.         "(fraktur"
  1988.         "(script"
  1989.         "(blackboardBold"
  1990.         "(-"
  1991.         "displayStyle"
  1992.         "textStyle"
  1993.         "scriptStyle"
  1994.         "scriptscriptStyle"
  1995.         }
  1996.     }
  1997. }
  1998.  
  1999.  
  2000. #############################################################################
  2001. #
  2002. # Special Key Bindings.
  2003. #
  2004. # abbreviations:  <o> = option, <z> = control, <s> = shift, <c> = command
  2005. #
  2006. #############################################################################
  2007.  
  2008. bind 0x14 <z> commentLine TeX
  2009. if {$optionIsMeta == "0"} then {
  2010.  
  2011.     #  use option for macros, escape for meta
  2012.  
  2013.     bind    'a'    <o>    alpha    "TeX"
  2014.     bind    'a'    <os>    angle    "TeX"
  2015.     bind    'a'    <oz>    forAll    "TeX"
  2016.     bind    'a'    <co>    acuteAccent    "TeX"
  2017.     
  2018.     bind    'b'    <o>    beta    "TeX"
  2019.     bind    'b'    <oz>    box    "TeX"
  2020.     bind    'b'    <co>    bar    "TeX"
  2021.     bind    'b'    <cs>    bold    "TeX"
  2022.     
  2023.     bind    'c'    <o>    chi    "TeX"
  2024.     bind    'c'    <co>    check    "TeX"
  2025.     bind    'c'    <cs>    citation    "TeX"
  2026.     bind    'c'    <cso>    calligraphic    "TeX"
  2027.     
  2028.     bind    'd'    <o>    delta    "TeX"
  2029.     bind    'd'    <os>    capDelta    "TeX"
  2030.     bind    'd'    <oz>    diamond    "TeX"
  2031.     bind    'd'    <co>    dot    "TeX"
  2032.     bind    'd'    <cso>    dblDot    "TeX"
  2033.     
  2034.     bind    'e'    <o>    epsilon    "TeX"
  2035.     bind    'e'    <os>    exists    "TeX"
  2036.     bind    'e'    <oz>    varEpsilon    "TeX"
  2037.     bind    'e'    <cs>    emphatic    "TeX"
  2038.     
  2039.     bind    'f'    <o>    phi    "TeX"
  2040.     bind    'f'    <os>    capPhi    "TeX"
  2041.     bind    'f'    <oz>    varPhi    "TeX"
  2042.     bind    'f'    <co>    fraction    "TeX"
  2043.     bind    'f'    <cs>    footnote    "TeX"
  2044.     
  2045.     bind    'g'    <o>    gamma    "TeX"
  2046.     bind    'g'    <os>    capGamma    "TeX"
  2047.     bind    'g'    <oz>    copyright    "TeX"
  2048.     bind    'g'    <co>    graveAccent    "TeX"
  2049.     
  2050.     bind    'h'    <o>    eta    "TeX"
  2051.     bind    'h'    <co>    hat    "TeX"
  2052.     bind    'h'    <cs>    smallCaps    "TeX"
  2053.     bind    'h'    <cso>    wideHat    "TeX"
  2054.     
  2055.     bind    'i'    <o>    iota    "TeX"
  2056.     bind    'i'    <oz>    dotlessI    "TeX"
  2057.     bind    'i'    <co>    integral    "TeX"
  2058.     bind    'i'    <cs>    italic    "TeX"
  2059.     bind    'i'    <cso>    mathItalic    "TeX"
  2060.     
  2061.     bind    'j'    <o>    partial    "TeX"
  2062.     bind    'j'    <oz>    dotlessJ    "TeX"
  2063.     
  2064.     bind    'k'    <o>    kappa    "TeX"
  2065.     
  2066.     bind    'l'    <o>    lambda    "TeX"
  2067.     bind    'l'    <os>    capLambda    "TeX"
  2068.     bind    'l'    <oz>    scriptL    "TeX"
  2069.     bind    'l'    <cs>    label    "TeX"
  2070.     
  2071.     bind    'm'    <o>    mu    "TeX"
  2072.     bind    'm'    <oz>    mapsTo    "TeX"
  2073.     bind    'm'    <co>    mbox    "TeX"
  2074.     bind    'm'    <cs>    mbox    "TeX"
  2075.     
  2076.     bind    'n'    <o>    nu    "TeX"
  2077.     bind    'n'    <os>    aleph    "TeX"
  2078.     bind    'n'    <oz>    intersection    "TeX"
  2079.     bind    'n'    <co>    nthRoot    "TeX"
  2080.     bind    'n'    <cs>    note    "TeX"
  2081.     
  2082.     bind    'o'    <o>    circle    "TeX"
  2083.     bind    'o'    <os>    bigCircle    "TeX"
  2084.     bind    'o'    <co>    overline    "TeX"
  2085.     bind    'o'    <cso>    overbrace    "TeX"
  2086.     
  2087.     bind    'p'    <o>    pi    "TeX"
  2088.     bind    'p'    <os>    capPi    "TeX"
  2089.     bind    'p'    <oz>    varPi    "TeX"
  2090.     bind    'p'    <co>    product    "TeX"
  2091.     bind    'p'    <cs>    pageRef    "TeX"
  2092.     
  2093.     bind    'q'    <o>    theta    "TeX"
  2094.     bind    'q'    <os>    capTheta    "TeX"
  2095.     bind    'q'    <oz>    varTheta    "TeX"
  2096.     
  2097.     bind    'r'    <o>    rho    "TeX"
  2098.     bind    'r'    <oz>    varRho    "TeX"
  2099.     bind    'r'    <co>    squareRoot    "TeX"
  2100.     bind    'r'    <cs>    roman    "TeX"
  2101.     
  2102.     bind    's'    <o>    sigma    "TeX"
  2103.     bind    's'    <os>    capSigma    "TeX"
  2104.     bind    's'    <oz>    varSigma    "TeX"
  2105.     bind    's'    <co>    sum    "TeX"
  2106.     bind    's'    <cs>    slanted    "TeX"
  2107.     
  2108.     bind    't'    <o>    tau    "TeX"
  2109.     bind    't'    <os>    dagger    "TeX"
  2110.     bind    't'    <oz>    triangle    "TeX"
  2111.     bind    't'    <co>    tilde    "TeX"
  2112.     bind    't'    <cs>    typewriter    "TeX"
  2113.     bind    't'    <cso>    wideTilde    "TeX"
  2114.     
  2115.     bind    'u'    <o>    upsilon    "TeX"
  2116.     bind    'u'    <os>    capUpsilon    "TeX"
  2117.     bind    'u'    <oz>    union    "TeX"
  2118.     bind    'u'    <co>    underline    "TeX"
  2119.     bind    'u'    <cso>    underbrace    "TeX"
  2120.     
  2121.     bind    'v'    <o>    nabla    "TeX"
  2122.     bind    'v'    <oz>    logicalOr    "TeX"
  2123.     bind    'v'    <co>    vector    "TeX"
  2124.     
  2125.     bind    'w'    <o>    omega    "TeX"
  2126.     bind    'w'    <os>    capOmega    "TeX"
  2127.     bind    'w'    <oz>    logicalAnd    "TeX"
  2128.     bind    'w'    <cs>    sansSerif    "TeX"
  2129.     
  2130.     bind    'x'    <o>    xi    "TeX"
  2131.     bind    'x'    <os>    capXi    "TeX"
  2132.     bind    'x'    <oz>    multiply    "TeX"
  2133.     bind    'x'    <cs>    crossRef    "TeX"
  2134.     
  2135.     bind    'y'    <o>    psi    "TeX"
  2136.     bind    'y'    <os>    capPsi    "TeX"
  2137.     
  2138.     bind    'z'    <o>    zeta    "TeX"
  2139.     
  2140.     bind    '\ '    <o>    thin    "TeX"
  2141.     bind    '\ '    <os>    negThin    "TeX"
  2142.     bind    '\ '    <oz>    medium    "TeX"
  2143.     bind    '\ '    <co>    thick    "TeX"
  2144.     bind    '\ '    <cs>    quad    "TeX"
  2145.     bind    '\ '    <cso>    dblQuad    "TeX"
  2146.     
  2147.     bind    ','    <o>    lessOrEqual    "TeX"
  2148.     bind    ','    <os>    subset    "TeX"
  2149.     bind    ','    <oz>    subsetOrEqual    "TeX"
  2150.     bind    ','    <co>    subscript    "TeX"
  2151.     
  2152.     bind    '.'    <o>    greaterOrEqual    "TeX"
  2153.     bind    '.'    <os>    superset    "TeX"
  2154.     bind    '.'    <oz>    supersetOrEqual    "TeX"
  2155.     bind    '.'    <co>    superscript    "TeX"
  2156.     
  2157.     bind    '/'    <o>    divide    "TeX"
  2158.     bind    '/'    <co>    fraction    "TeX"
  2159.     
  2160.     bind    '\;'    <o>    ellipsis    "TeX"
  2161.     bind    '\;'    <os>    centerDots    "TeX"
  2162.     bind    '\;'    <oz>    verticalDots    "TeX"
  2163.     bind    '\;'    <co>    diagonalDots    "TeX"
  2164.     
  2165.     # apostrophe:
  2166.     bind    0x27    <co>    acuteAccent    "TeX"
  2167.     bind    0x27    <cs>    quotes    "TeX"
  2168.     bind    0x27    <cso>    dblQuotes    "TeX"
  2169.  
  2170.     bind    '\['    <o>    brackets    "TeX"
  2171.     bind    '\['    <os>    braces    "TeX"
  2172.     bind    '\['    <co>    bigBrackets    "TeX"
  2173.     bind    '\['    <cso>    bigBraces    "TeX"
  2174.  
  2175.     bind    '\]'    <o>    displayStyle    "TeX"
  2176.     bind    '\]'    <os>    textStyle    "TeX"
  2177.     bind    '\]'    <oz>    scriptStyle    "TeX"
  2178.     bind    '\]'    <co>    scriptscriptStyle    "TeX"
  2179.     bind    '\]'    <cso>    bigLeftBrace    "TeX"
  2180.     
  2181.     bind    '\'    <o>    backslash    "TeX"
  2182.     bind    '\'    <os>    absoluteValue    "TeX"
  2183.     bind    '\'    <oz>    setMinus    "TeX"
  2184.     bind    '\'    <co>    bigAbsoluteValue    "TeX"
  2185.     bind    '\'    <cs>    "oneParameter"    "TeX"
  2186.     bind    '\'    <cso>    "twoParameters"    "TeX"
  2187.     
  2188.     bind    '`'    <co>    graveAccent    "TeX"
  2189.     bind    '`'    <cso>    tilde    "TeX"
  2190.         
  2191.     # Change to latexMath and latexDisplaymath, if desired:
  2192.     bind    '4'    <co>    texMath    "TeX"
  2193.     bind    '4'    <cso>    texDisplaymath    "TeX"
  2194.     
  2195.     bind    '5'    <o>    infinity    "TeX"
  2196.     
  2197.     bind    '6'    <o>    sectionMark    "TeX"
  2198.     bind    '6'    <co>    superscript    "TeX"
  2199.     
  2200.     bind    '7'    <o>    paragraphMark    "TeX"
  2201.     
  2202.     bind    '8'    <o>    bullet    "TeX"
  2203.     bind    '8'    <os>    asterisk    "TeX"
  2204.     bind    '8'    <oz>    centerDot    "TeX"
  2205.     
  2206.     bind    '9'    <os>    parentheses    "TeX"
  2207.     bind    '9'    <co>    bigParentheses    "TeX"
  2208.     
  2209.     bind    '0'    <oz>    emptySet    "TeX"
  2210.     
  2211.     bind    '-'    <o>    similar    "TeX"
  2212.     bind    '-'    <os>    minusOrPlus    "TeX"
  2213.     bind    '-'    <oz>    negation    "TeX"
  2214.     bind    '-'    <co>    subscript    "TeX"
  2215.     
  2216.     bind    '='    <o>    notEqual    "TeX"
  2217.     bind    '='    <os>    plusOrMinus    "TeX"
  2218.     bind    '='    <oz>    approximate    "TeX"
  2219.     bind    '='    <co>    bar    "TeX"
  2220.     
  2221.     bind    F5    <o>    math    "TeX"
  2222.     bind    F5    <os>    displaymath    "TeX"
  2223.     bind    F5    <oz>    equation    "TeX"
  2224.     
  2225.     bind    F6    <o>    "myArray"    "TeX"
  2226.     bind    F6    <os>    "eqnarray"    "TeX"
  2227.     bind    F6    <oz>    "eqnarrayStar"    "TeX"
  2228.     
  2229.     bind    F7    <o>    "enumerate"    "TeX"
  2230.     bind    F7    <os>    "itemize"    "TeX"
  2231.     bind    F7    <oz>    "description"    "TeX"
  2232.     
  2233.     bind    F8    <o>    "tabular"    "TeX"
  2234.     bind    F8    <os>    tabbing    "TeX"
  2235.     
  2236.     bind    F9    <o>    figure    "TeX"
  2237.     bind    F9    <os>    table    "TeX"
  2238.     bind    F9    <oz>    slide    "TeX"
  2239.     
  2240.     bind    F10    <o>    verbatim    "TeX"
  2241.     bind    F10    <os>    quote    "TeX"
  2242.     bind    F10    <oz>    quotation    "TeX"
  2243.     bind    F10    <co>    verse    "TeX"
  2244.     
  2245.     bind    F11    <o>    "index"    "TeX"
  2246.     bind    F11    <os>    "bibliography"    "TeX"
  2247.     
  2248.     bind    F12    <o>    "general"    "TeX"
  2249.     
  2250.     # tab:
  2251.     bind    0x30    nextTabStop    "TeX"
  2252.     bind    0x30    <s>     previousTabStop    "TeX"
  2253.     
  2254. } else {
  2255.     
  2256.     #    bind    macros    to    option-control,    use    option    as    meta
  2257.     
  2258.     bind    'a'    <zo>    alpha    "TeX"
  2259.     bind    'a'    <zos>    angle    "TeX"
  2260.     # bind    'a'    <oz>    forAll    "TeX"
  2261.     bind    'a'    <zco>    acuteAccent    "TeX"
  2262.     
  2263.     bind    'b'    <zo>    beta    "TeX"
  2264.     # bind    'b'    <oz>    box    "TeX"
  2265.     bind    'b'    <zco>    bar    "TeX"
  2266.     bind    'b'    <zcs>    bold    "TeX"
  2267.     
  2268.     bind    'c'    <zo>    chi    "TeX"
  2269.     bind    'c'    <zco>    check    "TeX"
  2270.     bind    'c'    <zcs>    citation    "TeX"
  2271.     bind    'c'    <zcso>    calligraphic    "TeX"
  2272.     
  2273.     bind    'd'    <zo>    delta    "TeX"
  2274.     bind    'd'    <zos>    capDelta    "TeX"
  2275.     # bind    'd'    <oz>    diamond    "TeX"
  2276.     bind    'd'    <zco>    dot    "TeX"
  2277.     bind    'd'    <zcso>    dblDot    "TeX"
  2278.     
  2279.     bind    'e'    <zo>    epsilon    "TeX"
  2280.     bind    'e'    <zos>    exists    "TeX"
  2281.     # bind    'e'    <oz>    varEpsilon    "TeX"
  2282.     bind    'e'    <zcs>    emphatic    "TeX"
  2283.     
  2284.     bind    'f'    <zo>    phi    "TeX"
  2285.     bind    'f'    <zos>    capPhi    "TeX"
  2286.     # bind    'f'    <oz>    varPhi    "TeX"
  2287.     bind    'f'    <zco>    fraction    "TeX"
  2288.     bind    'f'    <zcs>    footnote    "TeX"
  2289.     
  2290.     bind    'g'    <zo>    gamma    "TeX"
  2291.     bind    'g'    <zos>    capGamma    "TeX"
  2292.     # bind    'g'    <oz>    copyright    "TeX"
  2293.     bind    'g'    <zco>    graveAccent    "TeX"
  2294.     
  2295.     bind    'h'    <zo>    eta    "TeX"
  2296.     bind    'h'    <zco>    hat    "TeX"
  2297.     bind    'h'    <zcs>    smallCaps    "TeX"
  2298.     bind    'h'    <zcso>    wideHat    "TeX"
  2299.     
  2300.     bind    'i'    <zo>    iota    "TeX"
  2301.     # bind    'i'    <oz>    dotlessI    "TeX"
  2302.     bind    'i'    <zco>    integral    "TeX"
  2303.     bind    'i'    <zcs>    italic    "TeX"
  2304.     bind    'i'    <zcso>    mathItalic    "TeX"
  2305.     
  2306.     bind    'j'    <zo>    partial    "TeX"
  2307.     # bind    'j'    <oz>    dotlessJ    "TeX"
  2308.     
  2309.     bind    'k'    <zo>    kappa    "TeX"
  2310.     
  2311.     bind    'l'    <zo>    lambda    "TeX"
  2312.     bind    'l'    <zos>    capLambda    "TeX"
  2313.     # bind    'l'    <oz>    scriptL    "TeX"
  2314.     bind    'l'    <zcs>    label    "TeX"
  2315.     
  2316.     bind    'm'    <zo>    mu    "TeX"
  2317.     # bind    'm'    <oz>    mapsTo    "TeX"
  2318.     bind    'm'    <zco>    mbox    "TeX"
  2319.     bind    'm'    <zcs>    mbox    "TeX"
  2320.     
  2321.     bind    'n'    <zo>    nu    "TeX"
  2322.     bind    'n'    <zos>    aleph    "TeX"
  2323.     # bind    'n'    <oz>    intersection    "TeX"
  2324.     bind    'n'    <zco>    nthRoot    "TeX"
  2325.     bind    'n'    <zcs>    note    "TeX"
  2326.     
  2327.     bind    'o'    <zo>    circle    "TeX"
  2328.     bind    'o'    <zos>    bigCircle    "TeX"
  2329.     bind    'o'    <zco>    overline    "TeX"
  2330.     bind    'o'    <zcso>    overbrace    "TeX"
  2331.     
  2332.     bind    'p'    <zo>    pi    "TeX"
  2333.     bind    'p'    <zos>    capPi    "TeX"
  2334.     # bind    'p'    <oz>    varPi    "TeX"
  2335.     bind    'p'    <zco>    product    "TeX"
  2336.     bind    'p'    <zcs>    pageRef    "TeX"
  2337.     
  2338.     bind    'q'    <zo>    theta    "TeX"
  2339.     bind    'q'    <zos>    capTheta    "TeX"
  2340.     # bind    'q'    <oz>    varTheta    "TeX"
  2341.     
  2342.     bind    'r'    <zo>    rho    "TeX"
  2343.     # bind    'r'    <oz>    varRho    "TeX"
  2344.     bind    'r'    <zco>    squareRoot    "TeX"
  2345.     bind    'r'    <zcs>    roman    "TeX"
  2346.     
  2347.     bind    's'    <zo>    sigma    "TeX"
  2348.     bind    's'    <zos>    capSigma    "TeX"
  2349.     # bind    's'    <oz>    varSigma    "TeX"
  2350.     bind    's'    <zco>    sum    "TeX"
  2351.     bind    's'    <zcs>    slanted    "TeX"
  2352.     
  2353.     bind    't'    <zo>    tau    "TeX"
  2354.     bind    't'    <zos>    dagger    "TeX"
  2355.     # bind    't'    <oz>    triangle    "TeX"
  2356.     bind    't'    <zco>    tilde    "TeX"
  2357.     bind    't'    <zcs>    typewriter    "TeX"
  2358.     bind    't'    <zcso>    wideTilde    "TeX"
  2359.     
  2360.     bind    'u'    <zo>    upsilon    "TeX"
  2361.     bind    'u'    <zos>    capUpsilon    "TeX"
  2362.     # bind    'u'    <oz>    union    "TeX"
  2363.     bind    'u'    <zco>    underline    "TeX"
  2364.     bind    'u'    <zcso>    underbrace    "TeX"
  2365.     
  2366.     bind    'v'    <zo>    nabla    "TeX"
  2367.     # bind    'v'    <oz>    logicalOr    "TeX"
  2368.     bind    'v'    <zco>    vector    "TeX"
  2369.     
  2370.     bind    'w'    <zo>    omega    "TeX"
  2371.     bind    'w'    <zos>    capOmega    "TeX"
  2372.     # bind    'w'    <oz>    logicalAnd    "TeX"
  2373.     bind    'w'    <zcs>    sansSerif    "TeX"
  2374.     
  2375.     bind    'x'    <zo>    xi    "TeX"
  2376.     bind    'x'    <zos>    capXi    "TeX"
  2377.     # bind    'x'    <oz>    multiply    "TeX"
  2378.     bind    'x'    <zcs>    crossRef    "TeX"
  2379.     
  2380.     bind    'y'    <zo>    psi    "TeX"
  2381.     bind    'y'    <zos>    capPsi    "TeX"
  2382.     
  2383.     bind    'z'    <zo>    zeta    "TeX"
  2384.     
  2385.     bind    '\ '    <zo>    thin    "TeX"
  2386.     bind    '\ '    <zos>    negThin    "TeX"
  2387.     # bind    '\ '    <oz>    medium    "TeX"
  2388.     bind    '\ '    <zco>    thick    "TeX"
  2389.     bind    '\ '    <zcs>    quad    "TeX"
  2390.     bind    '\ '    <zcso>    dblQuad    "TeX"
  2391.     
  2392.     bind    ','    <zo>    lessOrEqual    "TeX"
  2393.     bind    ','    <zos>    subset    "TeX"
  2394.     # bind    ','    <oz>    subsetOrEqual    "TeX"
  2395.     bind    ','    <zco>    subscript    "TeX"
  2396.     
  2397.     bind    '.'    <zo>    greaterOrEqual    "TeX"
  2398.     bind    '.'    <zos>    superset    "TeX"
  2399.     # bind    '.'    <oz>    supersetOrEqual    "TeX"
  2400.     bind    '.'    <zco>    superscript    "TeX"
  2401.     
  2402.     bind    '/'    <zo>    divide    "TeX"
  2403.     bind    '/'    <zco>    fraction    "TeX"
  2404.     
  2405.     bind    '\;'    <zo>    ellipsis    "TeX"
  2406.     bind    '\;'    <zos>    centerDots    "TeX"
  2407.     # bind    '\;'    <oz>    verticalDots    "TeX"
  2408.     bind    '\;'    <zco>    diagonalDots    "TeX"
  2409.     
  2410.     # apostrophe:
  2411.     bind    0x27    <zco>    acuteAccent    "TeX"
  2412.     bind    0x27    <zcs>    quotes    "TeX"
  2413.     bind    0x27    <zcso>    dblQuotes    "TeX"
  2414.  
  2415.     bind    '\['    <zo>    brackets    "TeX"
  2416.     bind    '\['    <zos>    braces    "TeX"
  2417.     bind    '\['    <zco>    bigBrackets    "TeX"
  2418.     bind    '\['    <zcso>    bigBraces    "TeX"
  2419.  
  2420.     bind    '\]'    <zo>    displayStyle    "TeX"
  2421.     bind    '\]'    <zos>    textStyle    "TeX"
  2422.     # bind    '\]'    <oz>    scriptStyle    "TeX"
  2423.     bind    '\]'    <zco>    scriptscriptStyle    "TeX"
  2424.     bind    '\]'    <zcso>    bigLeftBrace    "TeX"
  2425.     
  2426.     bind    '\'    <zo>    backslash    "TeX"
  2427.     bind    '\'    <zos>    absoluteValue    "TeX"
  2428.     # bind    '\'    <oz>    setMinus    "TeX"
  2429.     bind    '\'    <zco>    bigAbsoluteValue    "TeX"
  2430.     bind    '\'    <zcs>    "oneParameter"    "TeX"
  2431.     bind    '\'    <zcso>    "twoParameters"    "TeX"
  2432.     
  2433.     bind    '`'    <zco>    graveAccent    "TeX"
  2434.     bind    '`'    <zcso>    tilde    "TeX"
  2435.     
  2436.     # Change to latexMath and latexDisplaymath, if desired:
  2437.     bind    '4'    <zco>    texMath    "TeX"
  2438.     bind    '4'    <zcso>    texDisplaymath    "TeX"
  2439.     
  2440.     bind    '5'    <zo>    infinity    "TeX"
  2441.     
  2442.     bind    '6'    <zo>    sectionMark    "TeX"
  2443.     bind    '6'    <zco>    superscript    "TeX"
  2444.     
  2445.     bind    '7'    <zo>    paragraphMark    "TeX"
  2446.     
  2447.     bind    '8'    <zo>    bullet    "TeX"
  2448.     bind    '8'    <zos>    asterisk    "TeX"
  2449.     # bind    '8'    <oz>    centerDot    "TeX"
  2450.     
  2451.     bind    '9'    <zos>    parentheses    "TeX"
  2452.     bind    '9'    <zco>    bigParentheses    "TeX"
  2453.     
  2454.     # bind    '0'    <oz>    emptySet    "TeX"
  2455.     
  2456.     bind    '-'    <zo>    similar    "TeX"
  2457.     bind    '-'    <zos>    minusOrPlus    "TeX"
  2458.     # bind    '-'    <oz>    negation    "TeX"
  2459.     bind    '-'    <zco>    subscript    "TeX"
  2460.     
  2461.     bind    '='    <zo>    notEqual    "TeX"
  2462.     bind    '='    <zos>    plusOrMinus    "TeX"
  2463.     # bind    '='    <oz>    approximate    "TeX"
  2464.     bind    '='    <zco>    bar    "TeX"
  2465.     
  2466.     bind    F5    <zo>    math    "TeX"
  2467.     bind    F5    <zos>    displaymath    "TeX"
  2468.     # bind    F5    <oz>    equation    "TeX"
  2469.     
  2470.     bind    F6    <zo>    "myArray"    "TeX"
  2471.     bind    F6    <zos>    "eqnarray"    "TeX"
  2472.     # bind    F6    <oz>    "eqnarrayStar"    "TeX"
  2473.     
  2474.     bind    F7    <zo>    "enumerate"    "TeX"
  2475.     bind    F7    <zos>    "itemize"    "TeX"
  2476.     # bind    F7    <oz>    "description"    "TeX"
  2477.     
  2478.     bind    F8    <zo>    "tabular"    "TeX"
  2479.     bind    F8    <zos>    tabbing    "TeX"
  2480.     
  2481.     bind    F9    <zo>    figure    "TeX"
  2482.     bind    F9    <zos>    table    "TeX"
  2483.     # bind    F9    <oz>    slide    "TeX"
  2484.     
  2485.     bind    F10    <zo>    verbatim    "TeX"
  2486.     bind    F10    <zos>    quote    "TeX"
  2487.     # bind    F10    <oz>    quotation    "TeX"
  2488.     bind    F10    <zco>    verse    "TeX"
  2489.     
  2490.     bind    F11    <zo>    "index"    "TeX"
  2491.     bind    F11    <zos>    "bibliography"    "TeX"
  2492.     
  2493.     bind    F12    <zo>    "general"    "TeX"
  2494.  
  2495.     # tab:
  2496.     bind    0x30    nextTabStop    "TeX"
  2497.     bind    0x30    <s>     previousTabStop    "TeX"
  2498.     
  2499. }
  2500.  
  2501. #================================================================================
  2502. # Random nonsense
  2503. #================================================================================
  2504.  
  2505. proc nextSubSection {} {
  2506.     set res [search -f 1 -r 1 -n {section\{} [nextLineStart [getPos]]]
  2507.     if {[string length $res]} {
  2508.         goto [lineStart [lindex $res 0]]
  2509.     } else {
  2510.         beep
  2511.     }
  2512. }
  2513. bind 'n' <zs> nextSubSection "TeX"
  2514.  
  2515. proc prevSubSection {} {
  2516.     set res [search -f 0 -r 1 -n {section\{} [lineStart [getPos]]]
  2517.     if {[string length $res]} {
  2518.         goto [lineStart [lindex $res 0]]
  2519.     } else {
  2520.         beep
  2521.     }
  2522. }
  2523. bind 'p' <zs> prevSubSection "TeX"
  2524.  
  2525.  
  2526. proc nextSection {} {
  2527.     set res [search -f 1 -r 1 -n {\\section\{} [nextLineStart [getPos]]]
  2528.     if {[string length $res]} {
  2529.         goto [lineStart [lindex $res 0]]
  2530.     } else {
  2531.         beep
  2532.     }
  2533. }
  2534. bind 'n' <zsc> nextSection "TeX"
  2535.  
  2536. proc prevSection {} {
  2537.     set res [search -f 0 -r 1 -n {\\section\{} [expr [lineStart [getPos]]-1]]
  2538.     if {[string length $res]} {
  2539.         goto [lineStart [lindex $res 0]]
  2540.     } else {
  2541.         beep
  2542.     }
  2543. }
  2544. bind 'p' <zsc> prevSection "TeX"
  2545.